#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>

using namespace std;

// 向量 vector,支持快速访问，连续存储数据的容器。类似数组
void testVector() {
    vector<int> vec_1;
    // 只有一个元素空间
    vector<int> vec_2(1);
    // 有6个元素，都是1
    vector<int> vec_3(6, 1);

    // 增加元素
    vec_1.push_back(10);
    vec_1.push_back(20);
    vec_1.push_back(30);
    vec_1.push_back(40);

    // 删除
    vec_1.pop_back();

    // 通过下标获取元素
    cout << vec_1[0] << endl;

    // 获取收尾的元素
    cout << vec_1.front() << endl;
    cout << vec_1.back() << endl;

    // 清空元素
    vec_1.clear();
    // 指定删除的元素
    // vec_1.erase(vec_1.begin(), vec_1.end());

    // 获取容器 容量大小，容量大小只整不减，即使清空
    cout << "container size:" << vec_1.capacity() << endl;
    // 如果vector是全局的向量会造成内存问题,可使用交换的方式清空内存
    // 测试全局的vector变成不占的内存，tempV占有vec_1,但是属于局部变量，方法出栈内存被释放
    vector<int> tempV;
    tempV.swap(vec_1);
}

// 队列
void testQueue() {
    queue<int> q;
    // 加入队列
    q.push(1);
    q.push(2);

    // 弹出
    q.pop();

    // 优先级队列,默认数字大的在队首,可以使用重载构造函数
    // less:数组大的在前面，greater：数字小的在前面
    priority_queue<int, vector<int>, greater<>> pq;
    pq.push(2);
    pq.push(1);
    pq.push(3);
    cout << pq.top() << endl;
}

// 栈
void testStack() {
    stack<int> s;
    s.push(1);
}

// 关联式容器，通过关键字保存和访问元素，类似 map set
void testSet() {
    // 元素不可重复
    set<int> set1 = {1, 2, 3, 4};
    // 添加成功，返回pair，bool表示是否成功
    pair<set<int>::iterator, bool> _pair = set1.insert(6);
    // 删除元素
    set1.erase(1);

    // 获取第0个元素
    set<int>::iterator it1 = set1.begin();
}

// 容器：stl标准模板库,分为序列式与关联式，排序与元素本身无关，由添加顺序决定
// 序列式容器：vector、list、dequeue、stack、queue、priority queue
int main26() {
    // testVector();
    // testQueue();
    return 0;
}